home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch01 / aheada.asm < prev    next >
Assembly Source File  |  1991-03-20  |  4KB  |  217 lines

  1. ; This is file AHEADA.ASM
  2. ;
  3. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14.  
  15. cseg    segment    byte public 'code'
  16.     assume    cs:cseg, ds:cseg, es:cseg, ss:nothing
  17.  
  18.     dw    offset init_routine
  19.     dw    offset paging_routine
  20.     dw    0    ; set to 1 if separate read & write windows or
  21.             ; only 64K of video RAM (ie: no paging)
  22.  
  23. def_tw    dw    80    ; filled in by go32 if GO32 env. var. is set
  24. def_th    dw    25
  25. def_gw    dw    640
  26. def_gh    dw    480
  27.  
  28. ;--------------------------------------------------------------------------
  29. ; Entry: AX=mode selection
  30. ;        0=80x25 text
  31. ;        1=default text
  32. ;        2=text CX cols by DX rows
  33. ;        3=biggest text
  34. ;        4=320x200 graphics
  35. ;        5=default graphics
  36. ;        6=graphics CX width by DX height
  37. ;        7=biggest non-interlaced graphics
  38. ;        8=biggest graphics
  39. ;
  40. ; NOTE: This runs in real mode, but don't mess with the segment registers.
  41. ;
  42. ; Exit:  CX=width (in pixels or characters)
  43. ;        DX=height
  44.  
  45. init_table    label    word
  46.     dw    offset init_0
  47.     dw    offset init_1
  48.     dw    offset init_2
  49.     dw    offset init_3
  50.     dw    offset init_4
  51.     dw    offset init_5
  52.     dw    offset init_6
  53.     dw    offset init_7
  54.     dw    offset init_8
  55.  
  56. init_routine    proc    far
  57.     cmp    ax,8
  58.     jbe    valid_req
  59.     ret
  60. valid_req:
  61.     shl    ax,1
  62.     mov    bx,ax
  63.     jmp    init_table[bx]
  64.  
  65. init_0: ; 80x25 text
  66.     mov    ax,3
  67.     int    10h
  68.     mov    cx,80
  69.     mov    dx,25
  70.     ret
  71.  
  72. init_1: ; default text
  73.     mov    cx,def_tw
  74.     mov    dx,def_th
  75.     jmp    init_2
  76.  
  77. init_2_table    label    word
  78.     dw    01h, 40, 25
  79.     dw    03h, 80, 25
  80. init_2_tend    label    word
  81.  
  82. init_2: ; CX*DX text
  83.     mov    si,offset init_2_table
  84. init_2a:
  85.     cmp    [si+2],cx
  86.     jb    init_2b
  87.     cmp    [si+4],dx
  88.     jb    init_2b
  89.     ; got a big enough one!
  90.     jmp    init_2c
  91. init_2b:
  92.     cmp    si,offset init_2_tend - 6
  93.     je    init_2c
  94.     add    si,6
  95.     jmp    init_2a
  96. init_2c:
  97.     mov    ax,[si]
  98.     push    si
  99.     int    10h
  100.     pop    si
  101.     mov    cx,[si+2]
  102.     mov    dx,[si+4]
  103.     ret
  104.  
  105. init_3: ; biggest text
  106.     mov    ax,[init_2_tend-6]
  107.     int    10h
  108.     mov    cx,[init_2_tend-4]
  109.     mov    dx,[init_2_tend-2]
  110.     ret
  111.  
  112. init_4: ; 320x200 graphics
  113.     mov    ax,13h
  114.     int    10h
  115.     mov    cx,320
  116.     mov    dx,200
  117.     ret
  118.  
  119. init_5: ; default graphics - should be 640x480 if supported
  120.     mov    cx,def_gw
  121.     mov    dx,def_gh
  122.     jmp    init_6
  123.  
  124. init_6_table    label    word
  125.     dw    13h, 320, 200
  126.     dw    60h, 640, 400
  127.     dw    61h, 640, 480
  128.     dw    62h, 800, 600
  129. init_6_tend    label    word
  130.  
  131. init_6: ; CX*DX graphics
  132.     mov    si,offset init_6_table
  133. init_6a:
  134.     cmp    [si+2],cx
  135.     jb    init_6b
  136.     cmp    [si+4],dx
  137.     jb    init_6b
  138.     ; got a big enough one!
  139.     jmp    init_6c
  140. init_6b:
  141.     cmp    si,offset init_6_tend - 6
  142.     je    init_6c
  143.     add    si,6
  144.     jmp    init_6a
  145. init_6c:
  146.     mov    ax,[si]
  147.     push    si
  148.     int    10h
  149.     pop    si
  150.     mov    cx,[si+2]
  151.     mov    dx,[si+4]
  152.     ret
  153.  
  154. init_7: ; biggest non-interlaced graphics
  155.     mov    ax,62h
  156.     int    10h
  157.     mov    cx,800
  158.     mov    dx,600
  159.     ret
  160.  
  161. init_8: ; biggest graphics
  162.     mov    ax,62h
  163.     int    10h
  164.     mov    cx,800
  165.     mov    dx,600
  166.     ret
  167.  
  168. init_routine    endp
  169.  
  170. ;--------------------------------------------------------------------------
  171. ; Entry: AH=read page
  172. ;        AL=write page
  173. ;
  174. ; NOTE: This runs in protected mode!  Don't mess with the segment registers!
  175. ; This code must be relocatable and may not reference any data!
  176. ;
  177. ; Exit: VGA configured.
  178. ;       AX,BX,CX,DX,SI,DI may be trashed
  179. ;
  180. ; Derived from VGAKIT Version 3.4
  181. ;    Copyright 1988,89,90 John Bridges
  182.  
  183.     assume    ds:nothing, es:nothing
  184.  
  185. paging_routine    proc    far
  186.     mov    ch,al
  187.         mov     dx,3ceh        ;Enable extended registers
  188.         mov     ax,200fh
  189.         out     dx,ax
  190.     mov    dl,0cch        ;bit 0
  191.     in    al,dx
  192.     mov    dl,0c2h
  193.     and    al,11011111b
  194.     shr    ch,1
  195.     jnc    skpa
  196.     or    al,00100000b
  197. skpa:    out    dx,al
  198.     mov    dl,0cfh        ;bits 1,2,3
  199.     mov    al,0
  200.     out    dx,al
  201.     inc    dx
  202.     in    al,dx
  203.     dec    dx
  204.     and    al,11111000b
  205.     or    al,ch
  206.     mov    ah,al
  207.     mov    al,0
  208.     out    dx,ax
  209.  
  210.     ret
  211. paging_routine    endp
  212.  
  213. ;--------------------------------------------------------------------------
  214.  
  215. cseg    ends
  216.     end
  217.